package com.sspku.weinotes.service;

import com.sspku.weinotes.entity.User;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sspku.weinotes.exception.IncorrectParameterException;
import com.sspku.weinotes.exception.NoSuchIdException;
import com.sspku.weinotes.exception.UserAlreadyExistsException;
import com.sspku.weinotes.exception.UserDoesNotExistException;

import javax.mail.MessagingException;

/**
* @author user
* @description 针对表【user】的数据库操作Service
* @createDate 2022-12-25 22:20:08
*/
public interface UserService extends IService<User> {
    /**
     * 注册用户
     *
     * @param name     昵称
     * @param username 用户名
     * @param password 密码
     * @param code     验证码
     * @return 注册用户信息
     */
    int registeredUser(String name, String username, String password, String code) throws IncorrectParameterException;

    /**
     * 获取验证码
     *
     * @param email 邮箱
     * @throws MessagingException         MessagingException
     * @throws UserAlreadyExistsException 用户已经存在
     */
    void getCode(String email) throws Exception, UserAlreadyExistsException;

    /**
     * 获取修改密码相关验证码
     *
     * @param email 邮箱
     * @return 重置密钥
     * @throws MessagingException        MessagingException
     * @throws UserDoesNotExistException 用户不存在
     */
    public Integer forgetPasswordGetCode(String email) throws Exception, UserDoesNotExistException;

    /**
     * 忘记密码
     *
     * @param code     验证码
     * @param vCode    密钥
     * @param password 新密码
     * @return 被重置密码的用户
     * @throws IncorrectParameterException 参数不正确
     * @throws UserDoesNotExistException   用户不存在
     */
   User forgetPassword(String code, String vCode, String password) throws IncorrectParameterException, UserDoesNotExistException;

    /**
     * 更改用户信息
     *
     * @param uid       用户ID
     * @param name     用户名
     * @param password 密码
     * @return 被更改的用户实体
     * @throws NoSuchIdException ID不存在
     */
    User changeUserProfile(Integer uid, String name, String password) throws NoSuchIdException, IncorrectParameterException;
}
